package br.com.ds3.model;

import java.security.SecureRandom;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;

import br.com.ds3.annotation.CharCase;
import br.com.ds3.annotation.CharCaseOption;
import br.com.ds3.util.Security;
import br.com.ds3.model.Perfil;

@Entity(name = "USUARIO")
@SequenceGenerator(sequenceName = "SEQUSUARIO", name = "SEQUSUARIO", allocationSize=1, initialValue = 1)
public class Usuario extends GenericModel{
			
	@Id
	@Column(name = "IDUSUARIO")
	@GeneratedValue(generator = "SEQUSUARIO", strategy = GenerationType.SEQUENCE)	
	private Long id;
	
	@Column(name = "NOMEUSUARIO", length = 50, nullable = false)	
	private String nomeUsuario;

	@Column(name = "SALT", nullable = false)		
	private Long salt;
	
	@Column(name = "SENHA", nullable = false)		
	private String senha;	
	
	@Column(name = "NOME", length = 50, nullable = false)	
	private String nome;

	@CharCase(caseOption = CharCaseOption.LOWER)
	@Column(name = "EMAIL", length = 50, nullable = false)		
	private String email;
	
	@Column(name = "CPF", length = 50, nullable = false)		
	private String cpf;
		
	@Enumerated(EnumType.STRING)
	private Perfil perfil;
	
	@ManyToMany( cascade  = {CascadeType.PERSIST, CascadeType.MERGE},
				 mappedBy = "usuarios",  
				 targetEntity = Grupo.class)  
	private List<Grupo> grupos;
	
	public Usuario()
	{
		// Configura o salt para armazenamento seguro das senhas
        SecureRandom random = new SecureRandom();
	    this.salt = random.nextLong();
	}
	

	@Override
	public Long getId() {
		return id;
	}

	@Override
	public void setId(Long id) {
		this.id = id;
	}	
	
	public boolean senhaCorreta(String senha)
	{
		String hash = Security.md5(salt + senha.toUpperCase());
		return hash.equalsIgnoreCase(this.senha);
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNomeUsuario() {
		return nomeUsuario;
	}

	public void setNomeUsuario(String nomeUsuario) {
		this.nomeUsuario = nomeUsuario;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public void setSenha(String senha) {
		this.senha = Security.md5(salt + senha);
		System.out.println("Set senha: " + senha);
	}

	public List<Grupo> getGrupos() {
		return grupos;
	}

	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}

	public String getSenha() {
		return senha;
	}
	
	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}


	public boolean getAcessoAdministrador() {
		return getPerfil().equals(Perfil.ADMINISTRADOR) || getPerfil().equals(Perfil.ATENDENTE); 
	}
	
	public boolean getAcessoParticipante() {
		return getPerfil().equals(Perfil.PARTICIPANTE); 
	}
	
	public boolean isParticipante() {
		return getPerfil() != null && getPerfil().equals(Perfil.PARTICIPANTE);
	}
	
	public boolean isAtendente() {
		return getPerfil() != null && getPerfil().equals(Perfil.ATENDENTE);
	}
	
	public boolean isAdministrador() {
		return getPerfil() != null && getPerfil().equals(Perfil.ADMINISTRADOR);
	}
}
